package  
{
	import fl.lang.Locale;
	import flash.display.Loader;
	import flash.display.MovieClip;
	import flash.display.Stage;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.media.Sound;
	import flash.media.SoundChannel;
	import flash.media.SoundTransform;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.text.engine.FontDescription;
	import flash.text.Font;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextFormatAlign;
	import flash.text.TextFieldAutoSize;
	import flash.text.AntiAliasType;
	import flash.ui.Keyboard;
	import Objetos.BarradeEnergia;
	import Objetos.Energia;
	import Objetos.Heroi;
	import Objetos.Lama;
	import Objetos.Montanha1;
	import Objetos.Montanha2;
	import Objetos.Pilha;
	import Objetos.Template;
	
	/**
	 * ...
	 * @author Pedro H. Machado Wigderowitz
	 */
	public class Main extends MovieClip
	{
		trace ("Hello World!");
		
		public  var MC_barradeenergia:            BarradeEnergia;
		public  var MC_energia:                   Energia;
		public  var MC_heroi:                     Heroi;
		private var MC_lama:                      Lama;
		public  var MC_montanha1:                 Montanha1;
		public  var MC_montanha2:                 Montanha2;
		public  var MC_pilha:                     Pilha;
		private var MC_plate:                     Template;
		private var TX_textoenergia:              TextField;
		private var TX_tempo:                     TextField;
		private var TX_score:                     TextField;
		private var TX_levelup:                   TextField;
		private var TX_gameover:                  TextField;
		private var TF_formatbranco:              TextFormat;
		private var TF_formatmarrom:              TextFormat;
		private var TF_levelup:                   TextFormat;
		private var FONT_fonte:                   Fonte;
		public  var SO_gameplay:                  Sound;
		public  var SO_desativamento:             Sound;
        public  var SO_rolamento:                 Sound;
		public  var SO_lama:                      Sound;
		public  var SO_explosao:                  Sound;
		public  var SO_energia:                   Sound;
		public  var SC_canalgameplay:             SoundChannel;
		public  var SC_canaldesativamento:        SoundChannel;
        public  var SC_canalrolamento:            SoundChannel;
		public  var SC_canallama:                 SoundChannel;
		public  var SC_canalexplosao:             SoundChannel;
		public  var SC_canalenergia:              SoundChannel;
		public  var ST_transformargameplay:       SoundTransform;
		public  var ST_transformardesativamento:  SoundTransform;
		public  var ST_transformarqueda:          SoundTransform;
        public  var ST_transformarrolamento:      SoundTransform;
		public  var ST_transformarlama:           SoundTransform;
		public  var ST_transformarexplosao:       SoundTransform;
		public  var ST_transformarenergia:        SoundTransform;
		public  var MC_tela =                     MovieClip;
		
		
		public  var UI_velocidade:                    uint;
		
		private var UI_pontos:                        uint = 0;
		public  var IN_minutos:                       int  = 0;
		private var IN_segundos1:                     int  = 0;
		private var IN_segundos2:                     int  = 0;
		private var IN_delaypontos:                   int  = 16;
		private var IN_delaytempo:                    int  = 0;
		public  var IN_delayenergia:                  int  = 9;
		public  var IN_delaygameoverdesativamento:    int  = 37;
		
		public var BO_gameover:         Boolean;
		public var BO_lama:             Boolean;
		
		private static var _instance:	Main = null;
		
		public static function getInstance():Main 
		{ 
			return _instance; 
		}
		
        public static function getStage():Stage
		{
			return getInstance().stage;
		}
		
		public function Main() 
		{
			_instance = this;
			iniciarJogo();
		}
		
		public function iniciarJogo():void
		{	
			MC_tela = new MovieClip();
			addChild(MC_tela);
			
			addEventListener(Event.ENTER_FRAME, update, false, 0, true);
			
			desenharTela();
		}
		
		public function desenharTela():void
		{	
			MC_heroi = new Heroi ();
			
			MC_barradeenergia = new BarradeEnergia();
			
			MC_energia = new Energia (MC_barradeenergia);
			
			MC_lama = new Lama();
			
			MC_montanha1 = new Montanha1();
			
			MC_montanha2 = new Montanha2();
			
			MC_pilha = new Pilha ();
			
			MC_plate = new Template ();
			
			//CHILDS
			MC_tela.addChild (MC_lama);
			MC_tela.addChild (MC_montanha1);
			MC_tela.addChild (MC_montanha2);
			MC_tela.addChild (MC_pilha);
			MC_tela.addChild (MC_barradeenergia);
			MC_tela.addChild (MC_energia);
			MC_tela.addChild (MC_plate);
			MC_tela.addChild (MC_heroi);
			
			
			FONT_fonte = new Fonte();
			
			TF_formatbranco         = new TextFormat();
			TF_formatbranco.size    = 32;
			TF_formatbranco.color   = 0xFFFFFF;
			TF_formatbranco.align   = TextFormatAlign.LEFT;
			TF_formatbranco.font    = FONT_fonte.fontName;
			
			TX_tempo                   = new TextField;
			TX_tempo.embedFonts        = true;
			TX_tempo.antiAliasType     = AntiAliasType.ADVANCED;
			TX_tempo.alpha             = 0.8;
			TX_tempo.width             = MC_plate.width;
			TX_tempo.height            = MC_plate.height / 2;
			TX_tempo.x                 = MC_plate.x - MC_plate.width / 2;
			TX_tempo.y                 = MC_plate.y - MC_plate.height / 2;
			TX_tempo.defaultTextFormat = TF_formatbranco;
			MC_tela.addChild (TX_tempo);
			
			TX_score                   = new TextField();
			TX_score.embedFonts        = true;
			TX_score.wordWrap          = true;
			TX_score.antiAliasType     = AntiAliasType.ADVANCED;
			TX_score.alpha             = 0.8;
			TX_score.width             = MC_plate.width;
			TX_score.height            = MC_plate.height / 2;
			TX_score.x                 = MC_plate.x - MC_plate.width / 2;
			TX_score.y                 = 10 + TX_tempo.y + TX_tempo.height / 2;
			TX_score.defaultTextFormat = TF_formatbranco;
			MC_tela.addChild (TX_score);
			
			TF_formatmarrom        = new TextFormat();
			TF_formatmarrom.size   = 58;
			TF_formatmarrom.color  = 0x996600;
			TF_formatmarrom.align  = TextFormatAlign.LEFT;
			TF_formatmarrom.font   = FONT_fonte.fontName;
			
			TX_textoenergia                   = new TextField();
			TX_textoenergia.embedFonts        = true;
			TX_textoenergia.wordWrap          = true;
			TX_textoenergia.antiAliasType     = AntiAliasType.ADVANCED;
			TX_textoenergia.alpha             = 0.8;
			TX_textoenergia.width             = MC_energia.width;
			TX_textoenergia.height            = MC_energia.height;
			TX_textoenergia.x                 = MC_energia.x - 21;
			TX_textoenergia.y                 = stage.stageHeight / 4;
			TX_textoenergia.defaultTextFormat = TF_formatmarrom;
			MC_tela.addChild (TX_textoenergia);
			
			TF_levelup        = new TextFormat ();
			TF_levelup.size   = 58;
			TF_levelup.color  = 0x996600;
			TF_levelup.align  = TextFormatAlign.CENTER;
			TF_levelup.font   = FONT_fonte.fontName;
			
			TX_levelup                   = new TextField ();
			TX_levelup.embedFonts        = true;
			TX_levelup.antiAliasType     = AntiAliasType.ADVANCED;
			TX_levelup.alpha             = 0.8;
			TX_levelup.width             = stage.stageWidth - MC_barradeenergia.width;
			TX_levelup.height            = 60;
			TX_levelup.x                 = MC_barradeenergia.width;
			TX_levelup.y                 = stage.stageHeight / 2;
			TX_levelup.visible           = false;
			TX_levelup.defaultTextFormat = TF_levelup;
			MC_tela.addChild (TX_levelup);
			
			TX_gameover                   = new TextField ();
			TX_gameover.embedFonts        = true;
			TX_gameover.wordWrap          = true;
			TX_gameover.antiAliasType     = AntiAliasType.ADVANCED;
			TX_gameover.alpha             = 0.8;
			TX_gameover.width             = stage.stageWidth - MC_barradeenergia.width;
			TX_gameover.height            = stage.stageHeight;
			TX_gameover.x                 = 30;
			TX_gameover.y                 = stage.stageHeight / 3 - 20;
			TX_gameover.visible           = false;
			TX_gameover.defaultTextFormat = TF_levelup;
			addChild (TX_gameover);
			
			//SONS DE GAMEPLAY
			SO_gameplay            = new Sound();
			SC_canalgameplay       = new SoundChannel();
			ST_transformargameplay = new SoundTransform();
			SO_gameplay.load (new URLRequest("Roll! Gameplay.mp3"));
			SC_canalgameplay                = SO_gameplay.play();
			ST_transformargameplay.volume   = 0.3;
			SC_canalgameplay.soundTransform = ST_transformargameplay;
			
			//SONS DE DESATIVAMENTO
			SO_desativamento            = new Sound();
			SC_canaldesativamento       = new SoundChannel();
			ST_transformardesativamento = new SoundTransform();
			SO_desativamento.load (new URLRequest ("Desativamento.mp3"));
			
			//SONS DE ROLAMENTO
			SO_rolamento            = new Sound();
			SC_canalrolamento       = new SoundChannel();
			ST_transformarrolamento = new SoundTransform();
			SO_rolamento.load (new URLRequest ("Rolamento.mp3"));
			
			//SONS DE LAMA
			SO_lama            = new Sound();
			SC_canallama       = new SoundChannel();
			ST_transformarlama = new SoundTransform();
			SO_lama.load (new URLRequest ("Lama.mp3"));
			
			//SONS DE EXPLOSÃO
			SO_explosao            = new Sound();
			SC_canalexplosao       = new SoundChannel();
			ST_transformarexplosao = new SoundTransform();
			SO_explosao.load (new URLRequest ("Explosao.mp3"));
			
			
			//SONS DE PILHA
			SO_energia            = new Sound();
			SC_canalenergia       = new SoundChannel();
			ST_transformarenergia = new SoundTransform();
			SO_energia.load (new URLRequest ("Energia.mp3"));
		}
		
		public function update(e:Event): void 
		{
			trace (BO_gameover);
			
			MC_energia.update();
			MC_heroi.update();
			MC_lama.update();
			MC_montanha1.update();
			MC_montanha2.update();
			MC_pilha.update();
			
			//SCORE
			TX_score.text = "Score: " + UI_pontos.toString();
		    
			if (IN_delaypontos > 0)
			{
				IN_delaypontos --;
			}
			
			//SCORE LEVEL 1
			if (IN_delaypontos <= 0 && IN_minutos < 1 && Heroi.BO_direita == false && Heroi.BO_esquerda == false)
			{
				UI_pontos += 2;
				IN_delaypontos = 16;
			}
			
			if (IN_delaypontos <= 0 && IN_minutos < 1 && Heroi.BO_direita == true || IN_delaypontos <= 0 && IN_minutos < 1 && Heroi.BO_esquerda == true)
		    {
			    UI_pontos += 1;
				IN_delaypontos = 16;
			}
			
			//SCORE LEVEL 2
			if (IN_delaypontos <= 0 && IN_minutos >= 1 && IN_minutos < 2 && Heroi.BO_direita == false && Heroi.BO_esquerda == false)
			{
				UI_pontos += 3;
				IN_delaypontos = 16;
			}
			
			if (IN_delaypontos <= 0 && IN_minutos >= 1 && IN_minutos < 2 && Heroi.BO_direita == true || IN_delaypontos <= 0 && IN_minutos >= 1 && IN_minutos < 2 && Heroi.BO_esquerda == true)
		    {
			    UI_pontos += 2;
				IN_delaypontos = 16;
			}
			
			//SCORE LEVEL 3
			if (IN_delaypontos <= 0 && IN_minutos >= 2 && IN_minutos < 3 && Heroi.BO_direita == false && Heroi.BO_esquerda == false)
			{
				UI_pontos += 4;
				IN_delaypontos = 16;
			}
			
			if (IN_delaypontos <= 0 && IN_minutos >= 2 && IN_minutos < 3 && Heroi.BO_direita == true || IN_delaypontos <= 0 && IN_minutos >= 2 && IN_minutos < 3 && Heroi.BO_esquerda == true)
		    {
			    UI_pontos += 3;
				IN_delaypontos = 16;
			}
			
			//SCORE LEVEL 4
			if (IN_delaypontos <= 0 && IN_minutos >= 3 && IN_minutos < 5 && Heroi.BO_direita == false && Heroi.BO_esquerda == false)
			{
				UI_pontos += 5;
				IN_delaypontos = 16;
			}
			
			if (IN_delaypontos <= 0 && IN_minutos >= 3 && IN_minutos < 5 && Heroi.BO_direita == true || IN_delaypontos <= 0 && IN_minutos >= 3 && IN_minutos < 5 && Heroi.BO_esquerda == true)
		    {
			    UI_pontos += 4;
				IN_delaypontos = 16;
			}
			
			//SCORE LEVEL 5
			if (IN_delaypontos <= 0 && IN_minutos >= 5 && Heroi.BO_direita == false && Heroi.BO_esquerda == false)
			{
				UI_pontos += 6;
				IN_delaypontos = 16;
			}
			
			if (IN_delaypontos <= 0 && IN_minutos >= 5 && Heroi.BO_direita == true || IN_delaypontos <= 0 && IN_minutos >= 5 && Heroi.BO_esquerda == true)
		    {
			    UI_pontos += 5;
				IN_delaypontos = 16;
			}
			
			//RELÓGIO
			TX_tempo.text = "Time:   " + IN_minutos.toString() + ":" + IN_segundos1.toString() + IN_segundos2.toString();
			if (IN_delaytempo > 0)
			{
				IN_delaytempo --;
			}
			
			if (IN_delaytempo <= 0)
			{
				IN_segundos2 += 1;
				IN_delaytempo = 36;
			}
			
			if (IN_segundos2 >= 10)
			{
				IN_segundos1 += 1;
				IN_segundos2 = 0;
			}
			
			if (IN_segundos1 >= 6)
			{
				IN_minutos  += 1;
				IN_segundos1 = 0;
			}
			
			//ENERGIA
			TX_textoenergia.text = "Energy";
			
			//LEVEL UP
			TX_levelup.text = "Level up!";
			
			if (IN_minutos == 1 && IN_segundos2 <= 5 || IN_minutos == 2 && IN_segundos2 <= 5 || IN_minutos == 3 && IN_segundos2 <= 5 || IN_minutos == 5 && IN_segundos2 <= 5)
			{
			    TX_levelup.visible = true;
			}
			 
			
			//DIFICULDADE
			//RIDÌCULO
			if (IN_minutos < 1 && BO_lama == false)
			{
				UI_velocidade = 10;
			}
			
			if (IN_minutos < 1 && BO_lama == true)
			{
				UI_velocidade =  5;
			}
			
			//FÀCIL
			if (IN_minutos >= 1 && IN_minutos < 2 && BO_lama == false)
			{
				UI_velocidade = 15;
			}
			
			if (IN_minutos >= 1 && IN_minutos < 2 && BO_lama == true)
			{
				UI_velocidade =  7.5;
			}
			
			//MÈDIO
			if (IN_minutos >= 2 && IN_minutos < 3 && BO_lama == false)
			{
				UI_velocidade = 20;
			}
			
			if (IN_minutos >= 2 && IN_minutos < 3 && BO_lama == true)
			{
				UI_velocidade =  10;
			}
			
			//DIFÌCIL
			if (IN_minutos >= 3 && IN_minutos < 5 && BO_lama == false)
			{
				UI_velocidade = 30;
			}
			
			if (IN_minutos >= 3 && IN_minutos < 5 && BO_lama == true)
			{
				UI_velocidade =  15;
			}
			
			//IMPOSSÌVEL
			if (IN_minutos >= 5 && BO_lama == false)
			{
				UI_velocidade = 40;
			}
			
			if (IN_minutos >= 5 && BO_lama == true)
			{
				UI_velocidade =  20;
			}
			
			//GAMEOVER
			TX_gameover.text = "You had a score of: " + UI_pontos.toString() + ", in a time of: " + IN_minutos.toString() + ":" + IN_segundos1.toString() + IN_segundos2.toString();
			
			if (BO_gameover)
			{
				TX_gameover.visible = true;
				
				removeChild (MC_tela);
				
				removeEventListener (Event.ENTER_FRAME, update);
			}	
		}
	}
}